package com.fanxing.ui;

import com.fanxing.utils.MergeFile;
import com.fanxing.utils.TempFileManager;

import javax.swing.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.StringJoiner;

/**
 * @author: fanxing
 * 启动界面
 */
public class StartJFrame extends JFrame implements ActionListener {

    // 合并按钮
    JButton merge = new JButton("合并");
    // 清空按钮
    JButton clear = new JButton("清空");

    // 提示文本
    JLabel tips = new JLabel("当前已添加文件:");
    JLabel fileList = new JLabel("<html><body></body></html>");

    // 拖放区域
    ImagePanel dropPanel;


    public StartJFrame(){
        // 清空临时文件
        try {
            TempFileManager.clearTempFiles();
        } catch (IOException e) {
            showJDialog("临时文件清空失败");
        }
        // 初始化界面 -- 界面尺寸等
        initJFrame();

        // 初始化界面 -- 添加控件
        initView();

        // 显示窗口
        this.setVisible(true);
    }

    // 初始化界面
    private void initJFrame(){
        this.setSize(1000, 600);//设置宽高
        this.setTitle("文件合并 v0.0.1 -- 能用就行版");//设置标题
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置关闭模式
        this.setLocationRelativeTo(null);//居中
        // this.setAlwaysOnTop(true);//置顶
        this.setLayout(null);//取消内部默认布局
        // 设置窗口图标
        this.setIconImage(new ImageIcon("image/软件图标.png").getImage());
        // 设置软件运行时的图标

        // 给合并按钮添加活动触发检测
        merge.addActionListener(this);
        clear.addActionListener(this);
    }

    public void initView(){
        // 清除组件
        this.getContentPane().removeAll();
        // 设置按钮位置和大小
        merge.setBounds(350, 465, 100, 30); // 合并按钮的位置和大小
        clear.setBounds(350, 510, 100, 30);
        dropPanel = new ImagePanel("image/addFiles.png"); // 创建拖放区域并设置背景图片
        dropPanel.setBounds(50, 50, 700, 400); // 拖放区域的位置和大小

        // 设置提示文本位置和大小
        tips.setBounds(775, 50, 150, 30);
        fileList.setBounds(775, 80, 150, 370);
        // 设置提示文本的背景颜色
        fileList.setBackground(new java.awt.Color(200, 200, 200));
        // 设置提示文本的字体和字号
        tips.setFont(new java.awt.Font("微软雅黑", 0, 20));
        fileList.setFont(new java.awt.Font("微软雅黑", 0, 16));
        // 设置提示文本的对齐方式 -- 顶部对齐
        fileList.setVerticalAlignment(JLabel.TOP);
        // 设置提示文本的水平对齐方式 -- 左对齐
        fileList.setHorizontalAlignment(JLabel.LEFT);
        // 设置提示文本为不透明
        fileList.setOpaque(true);

        // 添加按钮到窗口
        this.add(merge);
        this.add(clear);

        // 设置提示文本
        this.add(tips);
        this.add(fileList);

        // 添加拖放区域到窗口
        this.add(dropPanel);

        // 启用拖放功能
        enableDragAndDrop();
    }

    // 活动触发检测
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == clear){
            try {
                TempFileManager.clearTempFiles();
                fileList.setText(getFileList());
            } catch (IOException ex) {
                showJDialog("清空失败");
            }
        }
        if (e.getSource() == merge){
            try {
                new MergeFile().mergeTempFile();
                fileList.setText(getFileList());
            } catch (IOException ex) {
                showJDialog("合并失败");
            }
        }
    }

    // 拼接文件列表
    public String getFileList(){
        try {
            File[] files = TempFileManager.getAllTempFiles();
            if (files.length > 0){
                StringJoiner joiner = new StringJoiner("<br>");
                joiner.add("<html><body>");
                for (File file : files) {
                    joiner.add(file.getName());
                }
                joiner.add("</body></html>");
                return joiner.toString();
            } else {
                return "暂无文件";
            }
        } catch (IOException e) {
            return "文件列表获取失败";
        }
    }

    // 启用拖放功能
    private void enableDragAndDrop() {
        new DropTarget(dropPanel, DnDConstants.ACTION_COPY_OR_MOVE, new DropTargetAdapter() {
            @Override
            public void drop(DropTargetDropEvent dtde) {
                try {
                    if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
                        dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
                        List<File> files = (List<File>) dtde.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
                        for (File file : files) {
                            TempFileManager.saveTempFile(file.getAbsolutePath());
                        }
                        fileList.setText(getFileList());
                        initView();
                        dtde.dropComplete(true);
                    } else {
                        dtde.rejectDrop();
                    }
                } catch (Exception e) {
                    dtde.dropComplete(false);
                    e.printStackTrace();
                }
            }
        });
    }

    // 弹窗提示
    public static void showJDialog(String content) {
        // 创建一个弹框对象
        JDialog jDialog = new JDialog();
        // 给弹框设置大小
        jDialog.setSize(200, 150);
        // 让弹框置顶
        jDialog.setAlwaysOnTop(true);
        // 让弹框居中
        jDialog.setLocationRelativeTo(null);
        // 弹框不关闭永远无法操作下面的界面
        jDialog.setModal(true);

        // 创建Jlabel对象管理文字并添加到弹框当中
        JLabel warning = new JLabel(content);
        warning.setBounds(0, 0, 200, 150);
        jDialog.getContentPane().add(warning);

        // 让弹框展示出来
        jDialog.setVisible(true);
    }
}

